package com.wsl.aop.aspect;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class PackageAspect {

    //匹配ProductService类里头的所有方法
    @Pointcut("within(com.wsl.aop.service.AuthService)")
    public void matchType(){}

    //匹配com.wsl.aop.包及子包下所有类的方法
    public void matchPackage(){}

    //匹配AOP对象的目标对象为指定类型的方法 及DemoDao的aop代理对象的方法
    @Pointcut("this(com.wsl.aop.dao.DemoDao)")
    public void thisDemo(){}

    //匹配实现IDao接口的目标对象(而不是aop代理后的对象)的方法 这里即DemoDao的方法
    @Pointcut("target(com.wsl.aop.dao.IDao)")
    public void targetDemo(){}

    //匹配所有以Service结尾的bean里头的方法
    @Pointcut("bean(*Service)")
    public void beanDemo(){}


    /**
     *
     * 参数匹配
     *
     *
     */
    //匹配任何以find开头而且只有一个Long参数的方法
    @Pointcut("execution(* *..find*(Long))")
    public void argsDemo1(){}

    //匹配任何只有一个Long参数的方法
    @Pointcut("args(Long)")
    public void argsDemo2(){}

    //匹配任何以find开头的而且第一个参数为Long型的方法
    @Pointcut("execution(* * ..find*(Long,..))")
    public void argsDemo3(){}

    //匹配第一个参数为Long型的方法
    @Pointcut("args(Long,..)")
    public void argsDemo4(){}


    /**
     * 注解匹配
     */
    //匹配方法标注有AdminOnly的注解的方法
    @Pointcut("@annotation(com.wsl.aop.security.AdminOnly)")
    public void annoDemo(){}

    //匹配标注有Component的类底下的方法 要求的annotation的RetentionPolicy级别为CLASS
    @Pointcut("@within(org.springframework.stereotype.Component)")
    public void annoWithinDemo() {

    }
    //匹配标注有Component的类底下的方法 要求的annotation的RetentionPolicy级别为CLASS
    @Pointcut("@within(org.springframework.stereotype.Component)")
    public void annoTargetDemo() {

    }

    //匹配传入的参数类标注有Repository注解的方法
    @Pointcut("@args(org.springframework.stereotype.Repository)")
    public void annoArgsDemo(){}

}
